
#include "TcpServer.hpp"
#include <memory>
#include<functional>
#include "Protocol.hpp"
#include "Calculator.hpp"
// #include"CommandExec.hpp"


using cal_fun = std::function<Response(const Request& req)>;

class Parse
{
public:
         
    Parse(cal_fun c):_cal(c)
    {}



    // 这里package不一定有完整的报文
    // 不完整->继续读
    // 完整->提取->反序列化->交给计算模块来处理
    string Entry(string &package)
    {
        // 1. 判断报文的完整性！-> 协议部分的DeCode
        string message;
        string respstr;
        while (Decode(package, &message)) // 剩下的没有完整报文->只返回之前的完整报文
        {
            if (message.empty())
                break; // 解码成功->反序列化

            // 2. 得到完整报文就反序列化为结构化数据! message是一个曾经被序列化的
            Request req;
            if (!req.Deserializze(message)) // 成功就拿到了 x y oper
                break;

            // 3. 反序列化完成->计算
            Response resp = _cal(req);

            // 4. 发给对方结果->对Responce序列化
            string res;
            resp.Serializze(res);

            // 5.应答也要保证报文的完整性->添加长度报头字段EnCode!
            EnCode(res);
            // 6.拼接应答
            respstr += res;
        }

        return respstr;
    }

private:
    cal_fun _cal;

};

int main()
{
    ENABLE_CONSOLE_LOG();
    // Command cmd;

    // unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>([&cmd](string cmdstr){
    //        return cmd.Execute(cmdstr);
    // });
    //1. 计算模块
    Calculator mycal;
    //2.解析对象
    Parse myparse([&mycal](const Request& req){
        return mycal.Execute(req);
    });
    
    //3.通信模块
    // TcpServer 只负责IO
    unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>([&myparse](string& package){
         return myparse.Entry(package);
    });
    tsvr->InitServer();
    tsvr->Start();
    return 0;
}